Визуализация данных

“Обычный график дает аналитику гораздо больше пищи для размышлений, чем любая другая форма представления информации.” – Джон Тьюки

Визуализациия – один из важнейших этапов анализа данных. Различные графики могут помочь понять, что не так с вашмими данными, найти какие-то закономерности, понять какая зависимость между переменными (линейная, нелинейная), найти аномалии или выбросы и многое другое. К тому же визуализация это очень красиво!

Графики могут быть очень разными, например:

  1. Визуализация одной переменной (histogram, bar, boxplot).
  2. Визуализация нескольких переменных (scatter plot, line plot).
  3. Визуализация графов.
  4. Визуализация карты.
  5. Визуализация моделей.
  6. Визуализация 3D графиков.

На этом сайте можно найти большое количество разных типов графиков.

ggplot2

В стандартном пакете R есть визуализация с помощью функции plot. Она уже устарела и не такая красивая, как визуализация с помощью пакета ggplot2.

Установка и подгрузка пакета

Давайте установим и подгрузим уже известные нам пакеты, а также пакет ggplot2.

Принцип создания графика

Визуализация часто помогает найти какие-то закономерности в данных, которые потом можно использовать для построения моделей. Давайте возьмем набор данных mpg. Можно вызвать справку по этому датасету с помощью команды ?mpg. Взглянем на то, как выглядит наш набор данных.

## Observations: 234
## Variables: 11
## $ manufacturer <chr> "audi", "audi", "audi", "audi", "audi", "audi", "au…
## $ model        <chr> "a4", "a4", "a4", "a4", "a4", "a4", "a4", "a4 quatt…
## $ displ        <dbl> 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0, 2…
## $ year         <int> 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 199…
## $ cyl          <int> 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, …
## $ trans        <chr> "auto(l5)", "manual(m5)", "manual(m6)", "auto(av)",…
## $ drv          <chr> "f", "f", "f", "f", "f", "f", "f", "4", "4", "4", "…
## $ cty          <int> 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 17,…
## $ hwy          <int> 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 25,…
## $ fl           <chr> "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "…
## $ class        <chr> "compact", "compact", "compact", "compact", "compac…

В этом наборе данных представлена информация о 38 моделях автомобилей. Среди 11 переменных в этом датасете есть 2 следующие переменные:

  • displ – объем двигателя (в литрах)
  • hwy – эффективность расхода топлива, сколько миль машина может проехать с одним галлоном (около 4 литров) топлива

Скорее всего эти переменные взаимосвязаны. Чем больше объем двигателя, тем меньше миль машина сможет проехать. Давайте проверим это, нарисовав график.

Видно, что и правда существует какая-то отрицательная связь. Но нас интересует то, как можно строить графики с помощью пакета ggplot2.

  1. Любой график в ggplot2 начинается с функции ggplot(), внутри которой вы передайте обязательный аргумент data – это ваш набор данных, в котором находится информация для визуализации.
  2. Весь рисунок – это наложение нескольких слоев с помощью знака плюс (+). Функция ggplot() строит первый слой. Она создает систему координат, к которой можно начинать добавлять слои.

  1. Функция geom_point() накладывает следующий слой, который состоит из точек. Эта функция имеет обязательный аргумент mapping, в котором вы должны указать оси (переменные) для вашего графика. Существует целое семейство функций, которые имеют название geom_xxx.

Атрибуты графика

Вы можете также можете изменять ваш график. Например, вы хотите изменить цвет (color) и размер (size) точек. Внутри функции вы можете добавить эти аргументы.

Вы можете писать какой-то цвет в виде строки. А можете использовать формат HEX. Например на сайте вы можете выбрать нужный вам цвет и использовать его.

Также вы можете поставить не точки, а другую форму (shape). Можно например поставить треугольники.

На рисунке показаны все виды форм.

Стоит заметить, что формы с 21 по 25 могут иметь 2 цвета. Обычный атрибут color отвечает за цвет границы. Если вы хотите закрасить фигуру, то можно использовать атрибут fill.

Также с помощью атрибута alpha вы можете делать ваши точки более прозрачными. Этот аргумент должен принимать значения от 0 до 1. По умолчанию стоит 1.

Некоторые точки не стали прозрачными. Это произошло, так как на самом деле там не одна, а несколько точек, поэтому при наложении друг на друга они дали менее прозрачную точку. Это аргумент бывает очень удобным, когда вы визуализируете большой набор данных.

Другой взгляд на атрибуты

Атрибуты украшают график, но можно использовать их и по-другому. До этого мы рисовали график, в котором использовали две непрерывные переменные. То есть на графике мы можем увидеть взаимосвязь только переменных. Нарисовать третью ось и перейти в трехмерное пространство, чтобы добавить 3 переменную было бы не очень хорошим решением. Атрибуты, про которые мы с вами узнали могут помочь нам добавить информацию на график о других переменных.

У нас есть переменная drv, которая принимает только 3 значения. Эти значения указывают какой привод у машины.

## # A tibble: 3 x 1
##   drv  
##   <chr>
## 1 f    
## 2 4    
## 3 r

Можно, например расскрасить каждое значение в отдельный цвет. В этом случае нам нужно сделать следующее:

  1. ВАЖНО! Использовать атрибут color в функции aes.
  2. Передаем теперь этому артрибуты не какой-то цвет, а переменную drv.

Нарисуем наш новый график!

У нашего графика автоматически появилась легенда. Про нее мы тоже поговорим позже.

Попробуем теперь использовать переменную cyl, которая показывает количество цилиндров в двигателе. Эта переменная принимает значения 4, 5, 6 и 8.

График получился не таким как раньше. Это просходит, так как мы имеем числовую переменную. Но у нас всего 4 значения, поэтому стоит использовать факторный тип. Перевести переменную в факторный тип можно прямо внутри функции aes.

Вы можете использовать и другие атрибуты, а также их комбинации.

На таком графике уже можно увидеть взаимосвязь 4 переменных. Но не стоит этим увлекаться. График не должен быть сложным.

Виузализация временных рядов

До этого мы с вами говорили про график рассеяния (scatter plot). Он показывал взаимосвязь двух непрерывных переменных. Часто нам хочется посмотреть на динамику какого-то показателя (переменной) во времени.

Давайте возьмем датасет economics из пакеты dplyr. Видим, что у нас есть переменная date, которая уже имеет формат даты. А также какие-то показатели. Например уровень безработицы (uempmed). Давайте нарисуем график дата – уровень безработицы. Для этого используем слой geom_line(), который работает аналогично geom_point().

Давайте добавим еще временной ряд для переменной psavert, которая показывает процент личных сбережений людей. Мы можем просто нанести еще один слой geom_line().

Получилось два временных ряда на одной картинке, но они одного цвета, и легенда не появилась. Первый способ как это можно исправить это задать цвет и легенду самому, это очень неприятный способ. Второй способ это использовать знакомую нам функцию gather. С ggplot можно использовать pipe (%>%).

Если в вашем слое вы постоянно работаете с одними осями, то вы можете их указать прямо в функции ggplot, чтобы не писать их несколько раз.

Гистограмма

Гистограмма строится для одной непрерывной переменной. Это нужно, чтобы посмотреть на распределение нашей переменной. Для построения гистограммы достаточно указать одну ось **x* и использовать функцию geom_histogram.

Мы получили гистограмму, но она не очень хорошо выглядит. Возникают интервалы, в которых переменная не принимает никакие значения. Из-за этого эти интервалы пустые. Сейчас автоматически выбирается ширина прямоугольничков. Ее можно менять с помощью аргумента binwidth.

Часто нам не нужно абсолютное значение, а нужно плотность распределения. Ее можно добавить с помощью известной функции aes, внутри которой ей присовить значение ..density... Точками отделяем, чтобы R не подумал, что это название переменной.

Вы можете так же использовать атрибуты.

График не совсем понятный, так как у значения x равным 2.5 мы не понимаем долю setosa.

Есть несколько способов исправить это.

Первый способ: использовать аргумент position.

Эти графики не так хороши. Поэтому есть второй способ: использовать функцию geom_freqpoly вместо geom_histogram. Она рисует распределение линиями.

Сохранение графика в переменную

Вы можете сохранить часть ваших слое в какой-то переменной, а потом добавлять следующие слои. Это удобно, когда вы хотите строить разные графики.

Диаграмма

Диаграмма строится для одной дискретной переменной. То есть переменные принимающие конечное число значений (факторные). Их можно нарисовать аналогично с помощью функции geom_bar.

Давайте посмотрим на количество машин, которые имеют передний, задний привод или 4x4.

Вы так же можете использовать атрибуты.

Если на такой график смотреть неудобно, то можно сделать по каждой переменной отдельный столбец с помощью аргумента position.

Также есть другие аргументы.

Непрерывная и категориальная переменные

Иногда мы хотим посмотреть на комбинцаию непрерыной и категориальной переменной. Мы уже делали это, когда рисовали гистограмму и использовали в качестве атрибута цвет. Но сейчас мы хотим посмотреть прямо на наши наблюдения.

Видно, что для переменная cyl не принимает значения 5 и 7. Мы уже говорили, что она является факторной. Укажем это.

Так график выглядет уже лучше. Но есть проблема: некоторые точки накладываются друг на друга. Можно попробовать решить это с помощью атрибута alpha.

Но это помогает не очень хорошо. Существует функция geom_jitter, которая помогает немножко раскинуть значения вправо и влево на небольшую величину. В нашем случае, у нас переменная cyl принимает 3 значения (4,6,8). Давайте просто отклонимся от этих значений на небольшое значение, чтобы точки больше не накладывались друг на друга.

Эх! Точки уходят слишком далеко. С помощью аргумента width можно контролировать размер отклонения.

Так же можно рисовать распределение точек внутри каждой категории с помощью слоя geom_violin.

Две категориальные переменные

Рассмотрим связку двух категориальных переменных.

Видно, что график не несет никакого смысла. Так как мы не можем увидеть сколько точек лежит на пересечении двух категорий. Хотелось бы, чтобы размер точки зависел от количества наблюдений, которые имеют пересечение двух категорий. В этом нам поможет функция geom_count.

Рассмотрим другой способ. Возьмем датасет Vocab из пакета car. Описание датасета можно найти с помощью команды ?Vocab.

## Observations: 30,351
## Variables: 4
## $ year       <dbl> 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,…
## $ sex        <fct> Male, Male, Female, Female, Female, Male, Male, Male,…
## $ education  <dbl> 14, 16, 10, 10, 12, 16, 17, 10, 12, 11, 6, 5, 11, 12,…
## $ vocabulary <dbl> 9, 9, 9, 5, 8, 8, 9, 5, 3, 5, 5, 5, 6, 5, 5, 1, 4, 1,…

Логично предположить, что чем выше образование человека тем больше его оценка.

Видно, что оценки и образование округлены до какого-то знака. То есть мы опять работаем с 2 факторными переменными. Давайте попробуем использовать уже знакомую нам функцию geom_jitter, чтобы немного сместить значения.

Другое дело, давайте добавим еще прозрачности.

Пустые кружочки могут помочь еще больше.

Название графика и оси

Все графики, которые мы делали до этого не очень хороши. Их минус заключается в том, что непонятно что этот график отображает. С помощью функции labs вы можете добавить название графика (title), дополнительное подробное описание графика (subtitle), источник данных (caption), название осей (x и y), а также легенду.

Название осей можно также быстро поменять с помощью функций xlab() и ylab().

Можно также использовать формулы в названии осей с помощью функции quate(). Более подробную информация можно найти с помощью команды ?plotmath.

Оси

ggplot автоматически подбирает тип оси исходя от типа переменных.

Для изменения осей вы можете использовать семейство функций scale_*.

Внешним видом меток на осях и ключей легенды управляют два аргумента: breaks и labels.

  • breaks – управляет положением меток или значениями осей или ключей

  • labels – позволяет менять название меток

Например, можно сделать такой классный график.

Также есть аргумент limits, который задает диапозон значений, который мы хотим увидеть.

Это можно сделать и с помощью функций xlim и ylim.

Иногда эти два способа не работают. Тогда вам на может помочь функция coord_cartesian.

Легенда

Построение нескольких графиков по категориальным переменным (facet)

Очень классное видео, оттуда можно сделать гифку разъединения плюс показывает сколько строчек кода экономит эта функция

facet_grid:

Испоьзуем для деления сложного графика на несколько простых с помощью одной или двух категориальных переменных. Формула : rows ~ columns. Необязательно приводить переменные к факторам, ggplot сам их принудительно приведет. Если используем только одну категориальную переменную, то вторую обозначаем просто точкой(.).

Можно отразить 6 переменных на графике

## Error in is_missing(values): объект 'myCol' не найден

Иногда переменные не пересекаются:

## Error in ggplot(mamsleep, aes(x = time, y = name, col = sleep)): объект 'mamsleep' не найден

## Error: At least one layer must contain all faceting variables: `vore`.
## * Plot is missing `vore`
## * Layer 1 is missing `vore`
## Error: At least one layer must contain all faceting variables: `vore`.
## * Plot is missing `vore`
## * Layer 1 is missing `vore`

Стили

## 'data.frame':    30351 obs. of  4 variables:
##  $ year      : num  1974 1974 1974 1974 1974 ...
##  $ sex       : Factor w/ 2 levels "Female","Male": 2 2 1 1 1 2 2 2 1 1 ...
##  $ education : num  14 16 10 10 12 16 17 10 12 11 ...
##  $ vocabulary: num  9 9 9 5 8 8 9 5 3 5 ...
##  - attr(*, "na.action")= 'omit' Named int  1 2 3 4 5 6 7 8 9 10 ...
##   ..- attr(*, "names")= chr  "19720001" "19720002" "19720003" "19720004" ...

Можно видеть, что cyl это категориальная переменная, поэтому график получается не достаточно хорошим. Изменим график

Четвертый слой - Statistics

Первой функцией является geom_smooth.

Как работает с наблюдениями, если они делятся по цвету еще.

Метод loess работает только с наблюдениями <1000 Цвет общей линии и еще span

Тема

Вы можете изменять тему вашего рисунка с помощью функции theme. В пакете ggplot2 уже есть некоторые встроенные темы:

  • theme_grey()
  • theme_bw()
  • theme_linedraw()
  • theme_light()
  • theme_dark()
  • theme_minimal()
  • theme_classic()
  • theme_void()
  • theme_test()

Тема – это отдельны слой, который мы можем добавить.

Дополнительные темы можно найти в пакете ggthemes.

## Error in contrib.url(repos, "source"): trying to use CRAN without setting a mirror